#pragma once

//========= ZCM =========

// 初始化命令
enum InitCommand { Wait_Init = 0, Init, Deinit };
// 初始化反馈状态
enum InitState { Uninit = 0, Initializing, Init_Complete, Deinitializing, Deinit_Complete };

    enum ArmAction {
        LEFT_ARM,
        RIGHT_ARM
    };


//high-level or low-level控制模式
enum MotorControlMode {
    UNINITIALIZED,  // 未初始化
    LOW_LEVEL,      // 底层直接控制
    HIGH_LEVEL      // 高层位姿控制
};


enum ChassisMotion {
    STOP,
    FORWARD,
    BACKWARD,
    LEFT,
    RIGHT
};



// 待补充
enum ErrorCode {
    NO_ERROR = 0,
    MODE_TRANSITION_ERROR = 101,
    MOTOR_FAULT = 201,
    BATTERY_LOW = 301,
    SENSOR_FAILURE = 401
};




// 电机枚举定义
typedef enum
{
    // 轮毂电机
    MOTOR_WHEEL_LEFT  = 0,   // 轮毂电机（左，ID2）
    MOTOR_WHEEL_RIGHT = 1,   // 轮毂电机（右，ID1）

    // 升降电机
    MOTOR_LIFT        = 2,   // 升降电机（ID0）

    // 腰部电机
    MOTOR_WAIST_UP    = 3,   // 腰部电机（上，ID4） 俯仰
    MOTOR_WAIST_DOWN  = 4,   // 腰部电机（下，ID3） 旋转   

    // 头部电机
    MOTOR_HEAD_UP     = 5,   // 头部电机（上，ID6） 俯仰
    MOTOR_HEAD_DOWN   = 6,   // 头部电机（下，ID5） 旋转

    // 左臂电机（上->下:7~14）
    MOTOR_LEFT_ARM_1  = 7,   // 左臂电机1（ID7）
    MOTOR_LEFT_ARM_2  = 8,   // 左臂电机2（ID8）
    MOTOR_LEFT_ARM_3  = 9,   // 左臂电机3（ID9）
    MOTOR_LEFT_ARM_4  = 10,  // 左臂电机4（ID10）
    MOTOR_LEFT_ARM_5  = 11,  // 左臂电机5（ID11）
    MOTOR_LEFT_ARM_6  = 12,  // 左臂电机6（ID12）
    MOTOR_LEFT_ARM_7  = 13,  // 左臂电机7（ID13）
    MOTOR_LEFT_ARM_8  = 14,  // 左臂电机8（ID14）

    // 右臂电机（上->下:15~22）
    MOTOR_RIGHT_ARM_1 = 15,  // 右臂电机1（ID15）
    MOTOR_RIGHT_ARM_2 = 16,  // 右臂电机2（ID16）
    MOTOR_RIGHT_ARM_3 = 17,  // 右臂电机3（ID17）
    MOTOR_RIGHT_ARM_4 = 18,  // 右臂电机4（ID18）
    MOTOR_RIGHT_ARM_5 = 19,  // 右臂电机5（ID19）
    MOTOR_RIGHT_ARM_6 = 20,  // 右臂电机6（ID20）
    MOTOR_RIGHT_ARM_7 = 21,  // 右臂电机7（ID21）
    MOTOR_RIGHT_ARM_8 = 22,  // 右臂电机8（ID22）

    MOTOR_COUNT              // 电机总数
} EtherCAT_Motor_Index;



//目前只支持DM和YKS的电机
typedef enum {
    MOTOR_ERROR_NONE              = 0,         // 无错误 → 0x0000
    MOTOR_ERROR_DISCONNECTED      = (1 << 0),  // 电机断联 → 0x0001
    MOTOR_ERROR_OVERVOLTAGE       = (1 << 1),  // 过压 → 0x0002
    MOTOR_ERROR_UNDERVOLTAGE      = (1 << 2),  // 欠压 → 0x0004
    MOTOR_ERROR_OVERCURRENT       = (1 << 3),  // 过流 → 0x0008
    MOTOR_ERROR_MOS_OVERTEMP      = (1 << 4),  // MOS过温 → 0x0010
    MOTOR_ERROR_COIL_OVERTEMP     = (1 << 5),  // 线圈过温 → 0x0020
    MOTOR_ERROR_COMM_LOSS         = (1 << 6),  // 通信丢失 → 0x0040
    MOTOR_ERROR_OVERLOAD          = (1 << 7),  // 过载 → 0x0080
    MOTOR_ERROR_DISABLED          = (1 << 8),  // 失能状态 → 0x0100
    MOTOR_ERROR_ENABLED           = (1 << 9),  // 使能状态 → 0x0200
    MOTOR_ERROR_ENCODER_FAULT     = (1 << 10), // 电机编码器错误 → 0x0400
    MOTOR_ERROR_BRAKE_OVERVOLTAGE = (1 << 11), // 刹车电压过高 → 0x0800
    MOTOR_ERROR_DRIVER_FAULT      = (1 << 12), // DRV驱动错误 → 0x1000
    MOTOR_ERROR_OVERHEAT          = (1 << 13)  // 电机过热 → 0x2000
} Motor_Error_State;



/******* EtherCAT电机定义 *******/


typedef enum{
	YKS = 0,
	GQ,
	TH,
	LZ,
	DM,
	BM,
	SD,
	EY,
	ZE
}Motor_Manufacturer;
typedef enum{
    YKS_36 = 0,
    YKS_94,
    YKS_150,
    YKS_4315
}YKS_Motor_Type;

typedef enum{
	RobStride_03 = 0,
	RobStride_04
}RobStride_Motor_Type;

typedef enum{
	DM4310 = 0,
	DM4340
}DM_Motor_Type;

typedef enum{
	eRob110H120I_BHM = 0,
	eRob110H100I_FS,
	eRob110H160I_BHM
}ZE_Motor_Type;

typedef enum{
    MIX_CONTROL = 0,
    POS_CONTROL,
    SPD_CONTROL,
    TOR_CONTROL
}Control_Mode;

typedef enum{
    Un_Initialized = 0,
    Request_Initialize,
    Complete_Initialize
}Init_Mode;

/******* PDO定义 *******/
typedef struct{
    float Position_Actual;
    float Speed_Actual;
    float Torque_Actual;
    uint16_t Error_flag;
} __attribute__((packed)) Motor_Information;

typedef struct{
    uint16_t Control_Mode;   //位置，力矩，速度模式
    float KP;
    float KD;
    float Position;
    float Speed;
    float Torque;
} __attribute__((packed)) Motor_Control;

typedef struct{
    Motor_Control Motor1, Motor2, Motor3, Motor4, Motor5, Motor6, Motor7, Motor8;
} __attribute__((packed)) PDO_Output;

typedef struct{
    Motor_Information Motor1, Motor2, Motor3, Motor4, Motor5, Motor6, Motor7, Motor8;
} __attribute__((packed)) PDO_Input;

typedef struct{
    uint8_t manufacturer :4;
    uint8_t model :4;
} __attribute__((packed)) Motor_TypeDef;

typedef struct{
    Motor_TypeDef Motor_Type;
    uint16_t Motor_ID;
    uint8_t Init_flag;
} __attribute__((packed)) Motor_Config;


/******* EtherCAT电机控制结构体 *******/
typedef struct{
    uint8_t slave;
    uint8_t passage;
    float redirect;
    Motor_Config config;
    Motor_Control control;
    Motor_Information information;
} __attribute__((packed)) EtherCAT_Motor_TypeDef;

extern EtherCAT_Motor_TypeDef   EtherCAT_Motor[];
extern uint8_t EtherCAT_Motor_ErrorFlag;






typedef struct xbox_map  
{  
    int     time;  
    int     a;  
    int     b;  
    int     x;  
    int     y;  
    int     lb;  
    int     rb;  
    int     start;  
    int     back;  

    int     lx;  
    int     ly;  
    int     rx;  
    int     ry;
    int     lt;
    int     rt;  
    int     xx;  
    int     yy;  

}xbox_map_t;    